iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0
Software Development

《醫資生的 FHIR 30日入門:用 Postman 讀懂醫療資料交換》系列 第 20

Day 20|Observation:用FHIR表示檢驗與生命徵象

  • 分享至 

  • xImage
  •  

前言

前幾篇文章主要介紹Patient的讀取、搜尋及Bundle。

Patient Resource可以記錄病人的姓名、生日、聯絡方式及病歷號等基本行政資料,但不適合拿來記錄病人的體溫、血壓或抽血結果。

在FHIR中,許多測量、檢驗及臨床觀察資料會使用Observation Resource表示,例如:

  • 體溫
  • 心跳
  • 呼吸速率
  • 血壓
  • 身高
  • 體重
  • 血氧濃度
  • 血糖
  • 血紅素
  • 實驗室檢驗結果
  • 問卷或評估結果
  • 其他臨床觀察

今天不進行任何實際操作,而是透過一份虛構的體溫Observation,認識它的重要欄位及設計概念。

本文中的病人、時間及醫療資料皆為虛構教學範例,不代表任何真實人物或醫療判斷。


Observation是什麼?

Observation用來記錄對病人、裝置或其他對象進行觀察、檢驗或測量後所得到的結果。

可以簡單理解成:

觀察了什麼、在什麼時間觀察、觀察對象是誰,以及得到了什麼結果。

一筆Observation通常需要回答:

  1. 這筆結果目前是什麼狀態?
  2. 觀察或測量的項目是什麼?
  3. 資料屬於哪一位病人?
  4. 在什麼時間進行觀察?
  5. 得到什麼結果?
  6. 結果使用什麼單位?
  7. 結果是否偏高或偏低?
  8. 是否具有參考範圍?
  9. 由誰或哪個裝置產生?

Observation可以記錄哪些資料?

FHIR官方將Observation應用於許多健康照護測量及臨床資料。

生命徵象

  • 體溫
  • 心跳
  • 呼吸速率
  • 血壓
  • 血氧濃度

身體測量

  • 身高
  • 體重
  • 身體質量指數
  • 頭圍

實驗室檢驗

  • 血糖
  • 血紅素
  • 白血球
  • 血小板
  • 肝功能
  • 腎功能

臨床觀察與評估

  • 疼痛分數
  • 意識狀態
  • 吸菸狀態
  • 心理或功能評估
  • 問卷所得結果

Observation的用途很廣,但不是所有醫療資訊都應放入Observation。後面會再比較Observation、Condition及DiagnosticReport的差異。


一份體溫Observation

以下是一份簡化的FHIR R4 Observation:

{
  "resourceType": "Observation",
  "id": "temperature-001",
  "status": "final",
  "category": [
    {
      "coding": [
        {
          "system": "http://terminology.hl7.org/CodeSystem/observation-category",
          "code": "vital-signs",
          "display": "Vital Signs"
        }
      ],
      "text": "生命徵象"
    }
  ],
  "code": {
    "coding": [
      {
        "system": "http://loinc.org",
        "code": "8310-5",
        "display": "Body temperature"
      }
    ],
    "text": "體溫"
  },
  "subject": {
    "reference": "Patient/patient-001",
    "display": "王小明"
  },
  "encounter": {
    "reference": "Encounter/encounter-001",
    "display": "2026年9月3日門診"
  },
  "effectiveDateTime": "2026-09-03T09:05:00+08:00",
  "issued": "2026-09-03T09:06:00+08:00",
  "performer": [
    {
      "reference": "Practitioner/nurse-001",
      "display": "陳護理師"
    }
  ],
  "valueQuantity": {
    "value": 37.2,
    "unit": "°C",
    "system": "http://unitsofmeasure.org",
    "code": "Cel"
  },
  "interpretation": [
    {
      "coding": [
        {
          "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation",
          "code": "N",
          "display": "Normal"
        }
      ],
      "text": "正常"
    }
  ],
  "referenceRange": [
    {
      "low": {
        "value": 36.0,
        "unit": "°C",
        "system": "http://unitsofmeasure.org",
        "code": "Cel"
      },
      "high": {
        "value": 37.5,
        "unit": "°C",
        "system": "http://unitsofmeasure.org",
        "code": "Cel"
      },
      "text": "範例參考範圍:36.0~37.5°C"
    }
  ]
}

這份範例描述:

王小明在2026年9月3日門診期間,由陳護理師量測體溫,結果為37.2°C,狀態為final,並被標示為正常。

其中的參考範圍只是為了說明FHIR資料結構而建立的虛構數值,不能用來進行實際醫療判斷。真實參考範圍會受到量測部位、方法、設備、年齡及醫療機構規範等因素影響。


resourceType與id

"resourceType": "Observation",
"id": "temperature-001"

resourceType表示這是一筆Observation Resource。

id則是這筆Resource在FHIR Server中的邏輯識別碼。

它的邏輯位置可能是:

Observation/temperature-001

id不是檢驗代碼,也不是病人的病歷號。


status:結果目前處於什麼狀態?

"status": "final"

status是Observation的重要必填欄位,用來表示結果目前處於哪個階段。

FHIR R4常見的Observation狀態包括:

代碼 基本意義
registered 已登錄,但尚未取得結果
preliminary 初步結果
final 最終結果
amended 最終結果後又經過修正
corrected 已更正
cancelled 已取消
entered-in-error 資料輸入錯誤
unknown 狀態未知

preliminary和final的差異

preliminary表示結果仍可能變動,例如檢驗尚未完成全部確認。

final表示結果已完成,通常可被視為正式結果。

不過,final之後仍可能因特殊原因被修正,這時可能使用amendedcorrected

醫療系統不能忽略status,因為同一個數值在初步結果與最終結果中的意義不同。


category:這是哪一類Observation?

"category": [
  {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/observation-category",
        "code": "vital-signs",
        "display": "Vital Signs"
      }
    ],
    "text": "生命徵象"
  }
]

category用來將Observation歸入較大的類別。

常見類別包括:

category code 基本意義
vital-signs 生命徵象
laboratory 實驗室檢驗
imaging 影像相關觀察
survey 問卷或調查
exam 身體檢查結果
social-history 社會史
procedure 處置相關觀察
therapy 治療相關觀察
activity 活動相關資料

體溫屬於生命徵象,所以範例使用:

vital-signs

category只是較大的分類,還不能完整說明測量項目到底是體溫、心跳還是血壓。

要知道具體項目,需要查看code


code:觀察了什麼?

"code": {
  "coding": [
    {
      "system": "http://loinc.org",
      "code": "8310-5",
      "display": "Body temperature"
    }
  ],
  "text": "體溫"
}

code表示Observation實際測量或觀察的項目。

它使用CodeableConcept資料型別,可以同時包含:

  • 標準代碼
  • 院內代碼
  • 人類可閱讀文字

範例使用LOINC:

欄位 內容
system http://loinc.org
code 8310-5
display Body temperature
text 體溫

其中:

  • system+code協助電腦辨認測量項目。
  • displaytext協助人類閱讀。

category和code有什麼不同?

欄位 回答的問題 體溫範例
category 這是哪一大類資料? 生命徵象
code 實際觀察或測量什麼? 體溫

例如,體溫和心跳可能都屬於:

vital-signs

但是兩者的code不同。

因此,只看category不能確定Observation的實際測量項目。


subject:這筆資料屬於誰?

"subject": {
  "reference": "Patient/patient-001",
  "display": "王小明"
}

subject用來表示Observation的對象。

在這個例子中:

Patient/patient-001

代表這筆體溫屬於王小明。

display只是方便人類閱讀,真正的Resource關係由reference建立。

Observation的subject不一定只能是Patient。依照不同情境,也可能指向:

  • Group
  • Device
  • Location

不過,在一般病人檢驗及生命徵象資料中,subject通常是Patient。


encounter:資料在哪次就醫產生?

"encounter": {
  "reference": "Encounter/encounter-001",
  "display": "2026年9月3日門診"
}

encounter用來連結產生這筆Observation的就醫事件。

有了這段Reference,系統就能知道:

  • 這筆體溫屬於王小明
  • 它是在2026年9月3日這次門診中量測

同一位病人可能有許多次門診、急診或住院紀錄,因此連結Encounter能提供更完整的醫療情境。


effectiveDateTime:觀察發生的時間

"effectiveDateTime": "2026-09-03T09:05:00+08:00"

effectiveDateTime表示Observation在臨床上發生或有效的時間。

在這個例子中,它代表體溫實際量測的時間。

可以拆成:

部分 意義
2026-09-03 日期
T 日期與時間分隔
09:05:00 時、分、秒
+08:00 UTC+8時區

Observation也可能使用其他effective[x]形式,例如:

  • effectiveDateTime
  • effectivePeriod
  • effectiveTiming
  • effectiveInstant

其中的[x]表示這個欄位可以選擇規範允許的其中一種資料型別。

不能在JSON中直接寫:

"effective[x]": "..."

而要依照實際型別寫成:

"effectiveDateTime": "..."

或:

"effectivePeriod": {
  "start": "...",
  "end": "..."
}

issued:結果何時發布?

"issued": "2026-09-03T09:06:00+08:00"

issued表示這筆結果被正式提供或發布的時間。

它和effectiveDateTime不一定相同。

欄位 意義
effectiveDateTime 觀察或測量實際發生時間
issued 結果對外提供或發布的時間

例如:

  • 09:00採集血液
  • 09:30完成檢驗
  • 09:40審核並發布結果

臨床事件時間與結果發布時間可能不同,因此FHIR使用不同欄位表示。


performer:由誰負責這項觀察?

"performer": [
  {
    "reference": "Practitioner/nurse-001",
    "display": "陳護理師"
  }
]

performer表示負責這項Observation的人員、機構或裝置。

可能指向:

  • Practitioner
  • PractitionerRole
  • Organization
  • CareTeam
  • Patient
  • RelatedPerson

因為performer可以有一位以上,所以使用Array。

performer不一定是實際按下測量設備按鈕的人,也可能表示對結果負責或執行觀察的角色,需要依照實際情境及Profile定義。


valueQuantity:觀察結果

"valueQuantity": {
  "value": 37.2,
  "unit": "°C",
  "system": "http://unitsofmeasure.org",
  "code": "Cel"
}

valueQuantity表示具有數值及單位的結果。

可以拆成:

欄位 內容 用途
value 37.2 測量數值
unit °C 人類閱讀的單位
system http://unitsofmeasure.org 單位代碼系統
code Cel 標準化單位代碼

只提供:

"value": 37.2

是不夠的,因為接收方不知道數值使用攝氏、華氏或其他單位。

FHIR常搭配UCUM表示測量單位,讓系統能更準確地處理及比較數值。


Observation的結果不一定是Quantity

不同Observation會使用不同的value[x]型別。

常見形式包括:

欄位 適合的結果
valueQuantity 數值及單位
valueCodeableConcept 代碼化結果
valueString 一般文字
valueBoolean 是或否
valueInteger 整數
valueRange 數值範圍
valueRatio 比例
valueTime 時間
valueDateTime 日期及時間
valuePeriod 一段期間

例如,吸菸狀態可能使用:

"valueCodeableConcept": {
  "coding": [
    {
      "system": "https://example.org/CodeSystem/smoking-status",
      "code": "never",
      "display": "Never smoker"
    }
  ],
  "text": "從未吸菸"
}

是否懷孕等特定觀察情境可能使用Boolean:

"valueBoolean": false

不能在同一筆Observation中隨意同時使用多種value[x]結果。應依照該Observation的用途、Profile及規範選擇合適型別。


interpretation:結果如何解讀?

"interpretation": [
  {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation",
        "code": "N",
        "display": "Normal"
      }
    ],
    "text": "正常"
  }
]

interpretation提供對結果的分類性解讀,例如:

  • 正常
  • 異常
  • 偏高
  • 偏低
  • 危急

常見概念包括:

代碼 常見意義
N 正常
A 異常
H 偏高
L 偏低
HH 嚴重偏高
LL 嚴重偏低

實際可使用哪些代碼,需要依照FHIR規範、ValueSet及Profile判斷。

interpretation不是單純由任何Client看到數值後自行填寫,而通常來自產生或審核結果的醫療系統。


referenceRange:參考範圍

"referenceRange": [
  {
    "low": {
      "value": 36.0,
      "unit": "°C",
      "system": "http://unitsofmeasure.org",
      "code": "Cel"
    },
    "high": {
      "value": 37.5,
      "unit": "°C",
      "system": "http://unitsofmeasure.org",
      "code": "Cel"
    },
    "text": "範例參考範圍:36.0~37.5°C"
  }
]

referenceRange表示結果的參考範圍。

常見欄位包括:

  • low
  • high
  • type
  • appliesTo
  • age
  • text

參考範圍可能受到以下因素影響:

  • 年齡
  • 性別
  • 檢體類型
  • 檢驗方法
  • 儀器
  • 醫療機構
  • 特定族群
  • 臨床情境

所以FHIR允許一筆Observation包含多組referenceRange。

需要注意:

參考範圍不是單獨判定疾病的標準。

醫療結果仍需要由具有資格的醫療專業人員,配合症狀、病史、其他檢查及臨床情境判讀。


dataAbsentReason:沒有結果時怎麼表示?

不是每一筆Observation都有結果。

可能原因包括:

  • 尚未取得結果
  • 病人無法完成檢查
  • 檢體不足
  • 檢體受到污染
  • 儀器故障
  • 結果無法判讀
  • 資料不適用

FHIR可以使用dataAbsentReason說明缺少結果的原因。

例如:

"dataAbsentReason": {
  "coding": [
    {
      "system": "http://terminology.hl7.org/CodeSystem/data-absent-reason",
      "code": "not-performed",
      "display": "Not Performed"
    }
  ],
  "text": "未執行"
}

這比直接刪除value[x]卻不說明原因更清楚。

一般情況下,如果已經提供value[x],就不應再同時使用dataAbsentReason表示沒有資料。


bodySite:測量或觀察部位

"bodySite": {
  "text": "口腔"
}

bodySite可以表示觀察或測量的身體部位。

以體溫為例,不同部位可能包括:

  • 口腔
  • 腋下
  • 耳部
  • 額頭
  • 直腸

對部分臨床資料來說,測量部位會影響結果的解讀,因此不能只記錄數值。

實際使用時,應盡量使用適當標準代碼,而不是只放自由文字。


method:使用什麼方法?

"method": {
  "text": "電子體溫計測量"
}

method用來表示取得Observation結果的方法。

例如,同一種檢驗項目可能因:

  • 檢驗方法不同
  • 儀器不同
  • 計算方式不同
  • 採檢方式不同

而具有不同意義或參考範圍。

如果方法會影響結果解讀,就需要在資料中清楚表示。


specimen:使用哪一份檢體?

實驗室檢驗可能需要連結Specimen Resource:

"specimen": {
  "reference": "Specimen/specimen-001",
  "display": "血液檢體"
}

Specimen可能記錄:

  • 檢體類型
  • 採集時間
  • 採集部位
  • 採集方法
  • 容器
  • 檢體處理方式

例如,測量的是血清、血漿還是全血,可能影響檢驗項目的意義。

生命徵象通常不一定需要Specimen,但實驗室Observation經常與Specimen有關。


device:使用哪個裝置?

Observation也可能記錄產生資料的裝置:

"device": {
  "reference": "Device/thermometer-001",
  "display": "範例電子體溫計"
}

Device Resource可以進一步描述:

  • 裝置識別資料
  • 製造商
  • 型號
  • 序號
  • 裝置類型
  • 使用狀態

如果結果受到特定儀器或裝置影響,保留Device Reference有助於追蹤資料來源。


Observation.component:一筆Observation中的多組結果

有些觀察由多個相關數值共同組成。

最常見的例子是血壓,包括:

  • 收縮壓
  • 舒張壓

這兩個數值屬於同一次血壓測量,可以放在同一筆Observation的component中。

簡化結構如下:

{
  "resourceType": "Observation",
  "status": "final",
  "code": {
    "text": "血壓"
  },
  "subject": {
    "reference": "Patient/patient-001"
  },
  "component": [
    {
      "code": {
        "text": "收縮壓"
      },
      "valueQuantity": {
        "value": 120,
        "unit": "mmHg"
      }
    },
    {
      "code": {
        "text": "舒張壓"
      },
      "valueQuantity": {
        "value": 80,
        "unit": "mmHg"
      }
    }
  ]
}

component中的每一項都有自己的:

  • code
  • value[x]
  • dataAbsentReason
  • interpretation
  • referenceRange

下一篇將專門介紹血壓Observation及component


Observation和Condition有什麼不同?

Observation

記錄觀察、測量或檢驗所得的結果。

例如:

  • 血壓120/80 mmHg
  • 體溫37.2°C
  • 血糖95 mg/dL
  • 疼痛分數3分

Condition

記錄疾病、健康問題或診斷。

例如:

  • 高血壓
  • 糖尿病
  • 肺炎
  • 偏頭痛

可以比較:

Resource 回答的問題
Observation 觀察或測量到什麼結果?
Condition 病人有哪些疾病、問題或診斷?

一筆血壓偏高的Observation不一定能直接等同於高血壓Condition。診斷需要由醫療專業人員綜合判斷。


Observation和DiagnosticReport有什麼不同?

DiagnosticReport通常用來整理一份診斷性檢查或檢驗報告。

例如,一份血液檢驗報告可能包含:

  • 白血球Observation
  • 紅血球Observation
  • 血紅素Observation
  • 血小板Observation
  • 報告結論
  • 檢體資訊
  • 報告時間

DiagnosticReport可以透過result Reference連結多筆Observation。

可以簡化理解:

Resource 主要用途
Observation 單項或一組相關的觀察結果
DiagnosticReport 將多項結果及報告內容組織成一份報告

Observation提供較細的結果資料,DiagnosticReport則提供報告層級的整體資訊。


一筆Observation的核心結構

可以將Observation整理成:

Observation
├── status:結果狀態
├── category:資料大類
├── code:觀察項目
├── subject:資料屬於誰
├── encounter:與哪次就醫有關
├── effective[x]:觀察發生時間
├── issued:結果發布時間
├── performer:由誰產生
├── value[x]:觀察結果
├── interpretation:結果解讀
├── referenceRange:參考範圍
├── dataAbsentReason:缺少結果的原因
├── bodySite:身體部位
├── method:觀察方法
├── specimen:檢體
├── device:使用裝置
└── component:多組相關結果

實際Observation不一定同時包含所有欄位,需要依照資料內容、FHIR規範及Profile決定。


今日小結

今天認識了FHIR Observation Resource。

Observation可以表示生命徵象、實驗室檢驗、身體測量、問卷結果及其他臨床觀察。

重要欄位包括:

  • status
  • category
  • code
  • subject
  • encounter
  • effective[x]
  • issued
  • performer
  • value[x]
  • interpretation
  • referenceRange
  • dataAbsentReason
  • component

其中最重要的觀念是:

Observation的code說明測量什麼,value[x]則說明測量結果。

數值不能脫離測量項目、單位、時間及狀態單獨解讀。同樣地,一筆異常Observation也不能直接等同於某項疾病診斷。

下一篇將以血壓為例,深入介紹為什麼一筆Observation中需要使用component表示收縮壓及舒張壓。

明日預告

Day 21|血壓為什麼需要兩個數值?

參考資料

  1. HL7 FHIR R4:Observation
    https://hl7.org/fhir/R4/observation.html

  2. HL7 FHIR R4:Observation Definitions
    https://hl7.org/fhir/R4/observation-definitions.html

  3. HL7 FHIR R4:Vital Signs Profile
    https://hl7.org/fhir/R4/vital-signs.html

  4. HL7 FHIR R4:DiagnosticReport
    https://hl7.org/fhir/R4/diagnosticreport.html

  5. HL7 FHIR R4:Condition
    https://hl7.org/fhir/R4/condition.html

  6. LOINC:About LOINC
    https://loinc.org/about/


上一篇
Day 19|搜尋結果為什麼變成Bundle?
下一篇
Day 21|血壓為什麼需要兩個數值?
系列文
《醫資生的 FHIR 30日入門:用 Postman 讀懂醫療資料交換》30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言